package com.fs.sys.service;

import com.fs.common.base.service.CacheService;
import com.fs.common.bean.UserContextHolder;
import com.fs.common.exception.UnauthorizedException;
import com.fs.sys.bean.dto.UserDTO;
import com.fs.sys.entityservice.UserEntityService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.UUID;

/**
 * 应用登录
 *
 * @author LiuQi 2025/6/10-9:25
 * @version V1.0
 **/
@Service
public class AppLoginService {
    @Autowired
    private CacheService cacheService;

    @Autowired
    private UserEntityService userEntityService;

    /**
     * 获取应用登录授权码<br/>
     * 门户页面拿到这个code，带上其并跳转到第三方应用中，第三方应用需要使用该code来调用门户接口，将其转换成用户信息并返回给第三方应用<br/>
     * 第三方应用此时需要自行生成本系统内token，走后续自己的认证鉴权处理<br/>
     *
     * @return 应用登录授权码
     */
    public String getCode() {
        String code = UUID.randomUUID().toString().replace("-", "");
        String userId = UserContextHolder.getUserIdOrThrow();
        cacheService.cache("appAuth:" + code, userId, 10);
        return code;
    }

    /**
     * 根据传入的code解析用户信息
     *
     * @param code 应用授权码
     * @return 用户信息
     */
    public UserDTO parseUserInfo(String code) {
        String userId = cacheService.getAndDelete("appAuth:" + code);
        if (StringUtils.isBlank(userId)) {
            throw new UnauthorizedException();
        }
        return userEntityService.findById(userId).orElseThrow(UnauthorizedException::new);
    }
}
